package com.woniuxy.service.impl;

import com.woniuxy.entity.User;
import com.woniuxy.service.AuthService;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class AuthServiceImpl implements AuthService {

    /**
     * 1. 注入AuthenticationManager
     * 2. 封装为UsernamePasswordAuthenticationToken对象（实现了Authentication接口）
     * 3. 封装authenticate对象
     * */

    // AuthenticationManager 是一个接口，需要告诉security（配置类中）去创建authenticationManager对象
    // 通过 AuthenticationManager 去调后面的流程
    @Resource
    private AuthenticationManager authenticationManager;

    @Override
    public User Login(User user) {
        // 将user封装为UsernamePasswordAuthenticationToken对象（Authentication对象）
        UsernamePasswordAuthenticationToken token
                = new UsernamePasswordAuthenticationToken(user.getAccount(), user.getPassword());

        // 2.登录：如果账号或者密码有误 authenticate方法中会抛异常，就不会执行后面的代码了
        // 通过authenticationManager调用authenticate方法，进行登录的验证，进入返回authenticate对象的流程
        // 如果不为空，返回authenticate对象；为空，登录失败
        Authentication authenticate = authenticationManager.authenticate(token);

        // 3. 登录成功：要是不成功，代码根本不会执行到此处，直接异常处理
        System.out.println("登录成功");

        // 4. 获取用户信息：authenticate中含有用户信息
        // 强转
        User result = (User) authenticate.getPrincipal();
        System.out.println("result:"+result);

        // 5. 返回UserDetails对象
        return result;
    }


}
